#20์ฅ
- ์คํ๋ ๋ฌธ๋ฒ ์ง์์ ๋ฏธ๋น๋ก ์ธํ ์ค์๋ ์ธ์ ๋ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์, ์ค๋ฅ๋ฅผ ์ค์ฌ ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฐํ๊ธฐ ์ํด์๋ ์ข ๋ย
๊ทผ๋ณธ์ ์ธ ์ ๊ทผ
์ด ํ์ํ๋ค.- ๋ค์ ๋งํด, ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ธฐ ์ด๋ ค์ด ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ง๋ค๊ณ ๊ทธ ํ๊ฒฝ์์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ข ๋ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ด๋ผ๊ณ ํ ์ ์๋ค.
- ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด ES5๋ถํฐย
strict mode
๊ฐ ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
- strict mode๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด์ ๋ฌธ๋ฒ์ ์ข ๋ ์๊ฒฉํ ์ ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ๊ฐ๋ฅ์ฑ์ด ๋๊ฑฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ต์ ํ ์์
์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ์ฝ๋์ ๋ํด
๋ช ์์ ์ธ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
- ESLint ๊ฐ์ ๋ฆฐํธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด๋ strict mode์ ์ ์ฌํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
strict mode๋ฅผ ์ ์ฉํ๋ ค๋ฉด ์ ์ญ์ ์ ๋ ๋๋ ํจ์ ๋ชธ์ฒด์ ์ ๋์ โuse strictโ;๋ฅผ ์ถ๊ฐํ๋ค.
- ์ ์ญ์ ์ ๋์ ์ถ๊ฐํ๋ฉด ์คํฌ๋ฆฝํธ ์ ์ฒด์ strict mode๊ฐ ์ ์ฉ๋๋ค.
- ํจ์ ๋ชธ์ฒด ์ ๋์ ์ถ๊ฐํ๋ฉด ํด๋น ํจ์์ ์ค์ฒฉํจ์์ strict mode๊ฐ ์ ์ฉ๋๋ค.
- ์ฝ๋ ์ ๋์ โuse strictโ;๋ฅผ ์ถ๊ฐํ์ง ์์ผ๋ฉด ์ ๋๋ก ๋์ํ์ง ์๋๋ค.
- ์ ์ญ์ ์ ์ฉํ strict mode๋ ์คํฌ๋ฆฝํธ ๋จ์๋ก ์ ์ฉ๋๋ค.
<script> 'use strict'; </script> <script> x = 1; //์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. </script> <script> 'use strict'; y = 1; //Refernce Error </script>
- strict mode ์คํฌ๋ฆฝํธ์ non-script mode ์คํฌ๋ฆฝํธ๋ฅผ ํผ์ฉํ๋ ๊ฒ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค. ํนํ ์ธ๋ถ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ non-strict mode์ธ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์ ์ญ์ strict mode๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์๋ค.
- ์ด๋ฌํ ๊ฒฝ์ฐ ์ฆ์ ์คํ ํจ์๋ก ์คํฌ๋ฆฝํธ ์ ์ฒด๋ฅผ ๊ฐ์ธ์ ์ค์ฝํ๋ฅผ ๊ตฌ๋ถํ๊ณ ์ฆ์ ์คํ ํจ์(์ ์ธํ์๋ง์ ๋ฐ๋ก ํธ์ถ๋๋ ํจ์)์ ์ ๋์ strict mode๋ฅผ ์ ์ฉํ๋ค.
//์ฆ์ ์คํ ํจ์์ ์ ๋์ strict mode ์ ์ฉ (function() { 'use strict'; ... }());
- ํจ์ ๋จ์๋ก๋ strict mode๋ฅผ ์ ์ฉํ ์ ์๋ค.
- ํ์ง๋ง, ํจ์๋ง๋ค strict mode๋ฅผ ์ ์ฉํ๋ ์ฌ๋ถ๋ฅผ ๋ค๋ฅด๊ฒ ํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์ผ๋ฉฐ ๋ชจ๋ ํจ์์ ์ผ์ผ์ด ์ ์ฉํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด๋ค.
- ๋ฐ๋ผ์ strict mode๋ ์ฆ์ ์คํ ํจ์๋ก ๊ฐ์ผ ์คํฌ๋ฆฝํธ ๋จ์๋ก ์ ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
์ ์ธํ์ง ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด ReferenceError
๊ฐ ๋ฐ์ํ๋ค
(function () {
"use strict";
x = 1;
console.log(x); //ReferenceError: x is not defined
})();
delete ์ฐ์ฐ์๋ก ๋ณ์, ํจ์, ๋งค๊ฐ๋ณ์๋ฅผ ์ญ์ ํ๋ฉด SyntaxError
๊ฐ ๋ฐ์ํ๋ค.
(function () {
"use strict";
var x = 1;
delete x; //SyntaxError: Delete of an unqualified indentifier in strict mode.
function foo(a) {
delete a; //SyntaxError: Delete of an unqualified indentifier in strict mode.
}
delete foo; //SyntaxError: Delete of an unqualified indentifier in strict mode.
})();
- ์ค๋ณต๋ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉดย
SyntaxError
๊ฐ ๋ฐ์ํ๋ค.
(function () {
"use strict";
//SyntaxError: Duplicate parameter name not allowed in this context
function foo(x, x) {
return x + x;
}
console.log(foo(1, 2));
})();
- with ๋ฌธ์ ์ฌ์ฉํ๋ฉดย
SyntaxError
๊ฐ ๋ฐ์ํ๋ค. with ๋ฌธ์ ์ ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ์ค์ฝํ ์ฒด์ธ์ ์ถ๊ฐํ๋ค. - with๋ฌธ์ ๋์ผํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๋ฐ๋ณตํด์ ์ฌ์ฉํ ๋ ๊ฐ์ฒด ์ด๋ฆ์ ์๋ตํ ์ ์์ด์ ์ฝ๋๊ฐ ๊ฐ๋จํด์ง๋ ํจ๊ณผ๊ฐ ์์ง๋ง ์ฑ๋ฅ๊ณผ ๊ฐ๋ ์ฑ์ด ๋๋น ์ง๋ ๋ฌธ์ ๊ฐ ์๋ค.
(function () {
"use strict";
//SyntaxError: Strict mode code may not include a with statement
with ({ x: 1 }) {
console.log(x);
}
})();
- strict mode์์ ํจ์๋ฅผ ์ผ๋ฐ ํจ์๋ก์ ํธ์ถํ๋ฉด this์ undefined๊ฐ ๋ฐ์ธ๋ฉ๋๋ค.
- ์์ฑ์ ํจ์๊ฐ ์๋ ์ผ๋ฐ ํจ์ ๋ด๋ถ์์๋ this๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
(function () {
'use strict';
function foo() {
console.log(this); //undefined
}
foo();
function Foo() {
console.log(this); //Foo
}
new Foo();
}
- arguments ๊ฐ์ฒด๋ ํจ์๋ฅผ ํธ์ถํ ๋ ๋๊ธด ์ธ์๋ค์ด ๋ฐฐ์ด ํํ๋ก ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
- strict mode์์๋ ๋งค๊ฐ๋ณ์์ ์ ๋ฌ๋ ์ธ์๋ฅผ ์ฌํ ๋นํ์ฌ ๋ณ๊ฒฝํด๋ arguments ๊ฐ์ฒด์ ๋ฐ์๋์ง ์๋๋ค.
(function (a) {
"use strict";
a = 2;
console.log(arguments);
})(1);